ORIGIN_WIDTH = 720
ORIGIN_HEIGHT = 1280

FloatingAlign = {
  CENTER = "center",
  CENTER_HORIZONTAL = "hor",
  CENTER_VERTICAL = "ver",
}

FloatingCoordinate = {}
--[[ 여기서 width, height 은 디자아너 가이드 기준 해상도이다. ratio 와는 무관하다. (720x1280 or 1080x1920 ..)
    디폴트 패딩은 상하좌우 0으로 설정된다.
    디폴트 해상도는 720x1280 이다.
]]--
function FloatingCoordinate:new(width, height)
    local instance = {}
    if width == nil or height == nil then
        instance.design_width = ORIGIN_WIDTH
        instance.design_height = ORIGIN_HEIGHT
    else
        instance.design_width = width
        instance.design_height = height
    end
    instance.p_top = 0
    instance.p_bot = 0
    instance.p_left = 0
    instance.p_right = 0
    setmetatable(instance, self)
    self.__index = self
    return instance
end

--[[ 상하좌우 패딩 설정 ]]--
function FloatingCoordinate:setPadding(p_top, p_bot, p_left, p_right)
  self.p_top = p_top
  self.p_bot = p_bot
  self.p_left = p_left
  self.p_right = p_right
end

--[[
- 특정 위치 및 크기의 이미지 노드 생성 및 생성된 이미지 노드 위치, 크기 변경
첫번째 파라미터인 FilePath 에 노드를 입력하면 입력한 노드의 위치 및 포지션이 바뀐다.

 - x >= 0 : 왼쪽을 0 으로하여 위치 계산 / x < 0 : 오른쪽을 0 으로하여 위치 계산
 y >= 0 : 윗쪽을 0 으로하여 위치 계산 / y < 0 : 밑쪽을 0 으로하여 위치 계산

- x, y 의 부호가 같지 않아도 무방하다.
- 지정한 패딩을 초과할 경우 패딩 라인에 딱 맞게 리포지션 된다.
]]--
function FloatingCoordinate:getImageNode(filePath, x, y, width, height, ratio, blendMode)
    local d_width = self.design_width
    local d_height = self.design_height

    local isMinusY = false
    local isMinusX = false
    if y < 0 then isMinusY = true end
    if x < 0 then isMinusX = true end

    if ratio == 2 or ratio == 3 then
        d_height = d_height * 960/1280
    end

    if x < 0 then
        x = d_width + x - width - self.p_right
    else
        x = x + self.p_left
    end
    if y < 0 then
        y = d_height + y - height - self.p_bot
    else
        y = y + self.p_top
    end


    if ratio == 3 and isMinusY == true then
        y = y - 120.0
    elseif ratio == 3 and isMinusY == false then
        y = y + 120.0
    end

---------- TODO : 왼쪽 위 패딩 오버될시 안짤리고 적용됨

    -- y = y + self.p_top
    -- x = x + self.p_left

    if x < 0 then x = self.p_left end
    if y < 0 then y = self.p_top end

    -- if self.p_top ~= nil then y = y + self.p_top end
    -- if self.p_left ~= nil then x = x + self.p_left end

    if width > d_width - self.p_left - self.p_right then width = d_width - self.p_left - self.p_right end
    if height > d_height - self.p_top - self.p_bot then height = d_height - self.p_top - self.p_bot end
    -- if self.p_bot ~= nil and y > (d_height - self.p_bot) then y = d_height - self.p_bot end
    if (y + height) > (d_height - self.p_bot) then
      y = d_height - self.p_bot - height
    end

    -- if self.p_right ~= nil and x > (d_width - self.p_right) then x = d_width - self.p_right end
    if x + width > (d_width - self.p_right) then
      x = d_width - width - self.p_right
    end

----------

    y = y + height

    local x1 = x/(d_width/2) - 1
    local y1 = (d_height - y)/(d_height/2) - 1
    local width1 = 2 * width/d_width
    local height1 = 2 * height/d_height

    print("x,y : "..tostring(x1)..","..tostring(y1))
    print("w,h : "..tostring(width1)..","..tostring(height1))

    if type(filePath) == "string" then
        local sampler = TextureSampler.create(BASE_DIRECTORY .. filePath, false, false)
        sampler:setWrapMode(TextureWrap.CLAMP, TextureWrap.CLAMP)
        return KuruFloatingImageNode.createFromSampler(sampler, x1, y1, width1, height1, blendMode)
    else
        filePath:setRect(x1, y1, width1, height1)
        return filePath
    end
end

--[[
  풀스크린 이미지 노드 생성
  패딩 적용 된다.
]]--
function FloatingCoordinate:getFullImageNode(filePath, ratio, blendMode)
    local width = self.design_width
    local height = self.design_height

    if ratio == 2 then
      height = self.design_height * 960/1280
    elseif ratio == 3 then
      height = self.design_height * 720/1280
    end
    return self:getImageNode(filePath, 0, 0, width, height, ratio, blendMode)
end

--[[
  이미지 노드 정렬.
  마지막 파라미터 value 는 FloatingAlign.CENTER 일 경우 넣지 않아도 된다.
  CENTER_VERTICAL, CENTER_HORIZONTAL 의 경우에만 각각 가로, 세로의 위치를 잡기 위함이다.
]]--
function FloatingCoordinate:getAlignImageNode(filePath, width, height, ratio, blendMode, flag, value)
  local d_width = self.design_width
  local d_height = self.design_height

  if ratio == 2 or ratio == 3 then
    d_height = d_width * 4 / 3
  end

  if flag == FloatingAlign.CENTER then
    return self:getImageNode(filePath, (d_width - width - self.p_left - self.p_right)/2 , (d_height - height - self.p_top - self.p_bot)/2 , width, height, ratio, blendMode)
  end
  if flag == FloatingAlign.CENTER_HORIZONTAL then
    return self:getImageNode(filePath, (d_width - width - self.p_left - self.p_right)/2 , value , width, height, ratio, blendMode)
  end
  if flag == FloatingAlign.CENTER_VERTICAL then
    return self:getImageNode(filePath, value, (d_height - height - self.p_top - self.p_bot)/2 , width, height, ratio, blendMode)
  end
end

function FloatingCoordinate:getHeight(ratio)
  local d_width = self.design_width
  local d_height = self.design_height
  if ratio == 2 then
    d_height = d_width * 4 / 3
  elseif ratio == 3 then
    d_height = d_width * 4 / 3
  end
  return d_height
end


function getStickerSampler(filePath)
    local sampler = KuruAnimationSampler.createFromPath(BASE_DIRECTORY .. filePath, false, false)
    sampler:setRepeatCount(0)
    sampler:setWrapMode(TextureWrap.CLAMP, TextureWrap.CLAMP)
    sampler:setFPS(20)
    sampler:play()
    return sampler
end
